package com.baizhi.service.impl;

import com.baizhi.dao.CmfzUserMapper;
import com.baizhi.entity.CmfzUser;
import com.baizhi.entity.CmfzUserDTO;
import com.baizhi.service.CmfzUserService;
import com.baizhi.utils.GoeasyUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.text.SimpleDateFormat;
import java.util.*;

@Service
@Transactional
public class CmfzUserServiceImpl implements CmfzUserService {

    @Autowired
    private CmfzUserMapper cmfzUserMapper;

    @Autowired
    private GoeasyUtil goeasyUtil;


 /*   private final static Logger logger = (Logger) LoggerFactory.getLogger(CmfzUserServiceImpl.class);
    *//**
     * IO密集型任务 （常出现于线程中：数据库数据交互、文件上传下载、网络数据传输等等 能够体现多核处理器的优势）
     * CPU密集型任务 (常出现于线程中：复杂算法 能体现CPU版本的优势）
     *//*
    private static int corePoolSize = Runtime.getRuntime().availableProcessors();
    *//**
     * public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,
     *              TimeUnit unit,BlockingQueue<Runnable> workQueue)
     * corePoolSize用于指定核心线程数量
     * maximumPoolSize指定最大线程数
     * keepAliveTime和TimeUnit指定线程空闲后的最大存活时间
     * workQueue则是线程池的缓冲队列,还未执行的线程会在队列中等待
     * 监控队列长度，确保队列有界
     * 不当的线程池大小会使得处理速度变慢，稳定性下降，并且导致内存泄露。如果配置的线程过少，则队列会持续变大，消
     耗过多内存。
     * 而过多的线程又会 由于频繁的上下文切换导致整个系统的速度变缓——殊途而同归。队列的长度至关重要，它必须得是有
     界的，这样如果线程池不堪重负了它可以暂时拒绝掉新的请求。
     * ExecutorService 默认的实现是一个无界的 LinkedBlockingQueue。
     并行
     *//*
    public static ThreadPoolExecutor executor = new ThreadPoolExecutor(corePoolSize,
            corePoolSize+1, 10l, TimeUnit.SECONDS,new LinkedBlockingQueue<Runnable>(1000));
*/

    @Override
    public Map selectCmfzUserDatagrid(int page, int rows) {
        int start=(page-1)*rows;
        List<CmfzUser> cmfzUserList=cmfzUserMapper.selectCmfzUserDatagrid(start,rows);

        int count=cmfzUserMapper.selectCmfzUserCount();
        Map map=new HashMap();
        map.put("total",count);
        map.put("rows",cmfzUserList);

        return map;
    }

    @Override
    public void deleteSomeUsers(int[] ids) {
        //实时展示用户数量
        goeasyUtil.publish();
        cmfzUserMapper.deleteSomeUsers(ids);
    }


    @Override
    public Map selectBoysAndGirls() {
        Map map=new HashMap();
        int count=cmfzUserMapper.selectCmfzUserCount();
        int boys=cmfzUserMapper.selectBoys();
        int girls=count-boys;

        map.put("boys",boys);
        map.put("girls",girls);
        return map;
    }

    @Override
    public Map selectIntervalUsers() {
        Map map=new HashMap();
        //获取当前时间
        Calendar c = Calendar.getInstance();//日历
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//格式工具
        //今天
        Date now=c.getTime();
        c.add(Calendar.DAY_OF_MONTH, -7);//日期偏移,正数向前,负数向后!
        //前七天
        Date seven=c.getTime();
        //距离当前日期0-7天内的新注册用户人数
        int nearSeven = cmfzUserMapper.selectIntervalUsers(seven, now);

        //前十四天
        c.add(Calendar.DAY_OF_MONTH, -7);//日期偏移,正数向前,负数向后!
        Date fouteen=c.getTime();
        int a1 = cmfzUserMapper.selectIntervalUsers(fouteen, now);

        //距离当前日期7-14天内的新注册用户人数
        int middleSeven=a1-nearSeven;

        //前二十一天
        c.add(Calendar.DAY_OF_MONTH, -7);//日期偏移,正数向前,负数向后!
        Date twentyOne=c.getTime();
        int a2=cmfzUserMapper.selectIntervalUsers(twentyOne, now);
        //距离当前日期14-21天内的新注册用户人数
        int farSeven=a2-a1;

        map.put("nearSeven",nearSeven);
        map.put("middleSeven",middleSeven);
        map.put("farSeven",farSeven);

        return map;
    }

	//地图相关的
    @Override
    public Map selectUserCountMap() {
        //实时展示用户数量
        goeasyUtil.publish();
        Map map=new HashMap();
        List<CmfzUserDTO> cmfzUserDTOList=cmfzUserMapper.selectUserCountMap();
        map.put("str",cmfzUserDTOList);
        return map;
    }

    @Override
    public CmfzUser selectOneUser(Integer userId) {
        return cmfzUserMapper.selectOneUser(userId);
    }

    @Override
    public void updatePassword(Integer userId, String userPassword) {
        cmfzUserMapper.updatePassword(userId,userPassword);
    }
}
